<?php

/**
 * Green Calc
 * Calcs Model for Calc Component
 * 2009-2014 All rights reserved
 * @link http://www.greenkey.ru
 * @license GNU/GPL v3
 */
// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.modellist');

/**
 * Calc Model
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class CalcModelCalcs extends JModelList {

    /**
     * Calcs data array
     * @var array
     */
    var $_data;

    /**
     * Конструктор.
     *
     * @param   array  $config  Массив с конфигурационными параметрами.
     */
    public function __construct($config = array()) {
        // Добавляем валидные поля для фильтров и сортировки.
        if (empty($config['filter_fields'])) {
            $config['filter_fields'] = array(
                'id', 'id',
                'caption', 'caption',
                'state', 'state',
                'ordering', 'ordering',
            );
        }

        parent::__construct($config);
    }

    /**
     * Метод для построения SQL запроса для загрузки списка данных.
     *
     * @return  string  SQL запрос.
     */
    protected function getListQuery() {

        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        // Выбираем поля.
        //$query->select('id, caption, state, ordering');
        $query->select('*');
        $query->from('#__calc');

        // Фильтруем по состоянию.
        $published = $this->getState('filter.state');

        if (is_numeric($published)) {
            $query->where('state = ' . (int) $published);
        } elseif ($published === '') {
            $query->where('(state = 0 OR state = 1)');
        }

        // Фильтруем по поиску в тексте сообщения.
        $search = $this->getState('filter.search');

        if (!empty($search)) {
            $search = $db->quote('%' . $db->escape($search, true) . '%', false);
            $query->where('caption LIKE ' . $search);
        }

        // Добавляем сортировку.
        $orderCol = $this->state->get('list.ordering', 'id');
        $orderDirn = $this->state->get('list.direction', 'desc');
        $query->order($db->escape($orderCol . ' ' . $orderDirn));
        
        return $query;
    }

    /**
     * Метод для получения store id, которое основывается на состоянии модели.
     *
     * @param   string  $id  Идентификационная строка для генерации store id.
     *
     * @return  string  Store id.
     */
    protected function getStoreId($id = '') {
        // Компилируем store id.
        $id .= ':' . $this->getState('filter.search');
        $id .= ':' . $this->getState('filter.state');

        return parent::getStoreId($id);
    }

    /**
     * Метод для авто-заполнения состояния модели.
     *
     * @param   string  $ordering   Поле сортировки.
     * @param   string  $direction  Направление сортировки (asc|desc).
     *
     * @return  void
     */
    protected function populateState($ordering = null, $direction = null) {

        // Получаем и устанавливаем значение фильтра состояния.
        $published = $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'string');
        $this->setState('filter.state', $published);

        // Получаем и устанавливаем значение фильтра поиска по тексту сообщения.
        $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
        $this->setState('filter.search', $search);

        parent::populateState('id', 'desc');
    }

}
